Add a quick subsurface tests
authorMatthias Clasen <mclasen@redhat.com>
Wed, 17 Sep 2014 15:09:52 +0000 (11:09 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 17 Sep 2014 15:10:41 +0000 (11:10 -0400)
Just to have some code that uses subsurfaces inside a widget
tree, and not like a 'pseudo-toplevel'.

tests/Makefile.am
tests/subsurface.c [new file with mode: 0644]

index 374fddb2a5d115f02633d7e453fa8b5482f60d25..f4b84c8a25a6b12fc031f0c2f38016ce81d56bb3 100644 (file)
@@ -25,6 +25,7 @@ testsocket_programs = testsocket testsocket_child
 endif
 
 noinst_PROGRAMS =  $(TEST_PROGS)       \
+       subsurface                      \
        animated-resizing               \
        motion-compression              \
        scrolling-performance           \
diff --git a/tests/subsurface.c b/tests/subsurface.c
new file mode 100644 (file)
index 0000000..bfd0ea7
--- /dev/null
@@ -0,0 +1,110 @@
+#include <gtk/gtk.h>
+
+
+static void     da_realize       (GtkWidget     *widget);
+static void     da_size_allocate (GtkWidget     *widget,
+                                  GtkAllocation *allocation);
+static gboolean da_draw          (GtkWidget     *widget,
+                                  cairo_t       *cr);
+
+typedef GtkDrawingArea DArea;
+typedef GtkDrawingAreaClass DAreaClass;
+
+G_DEFINE_TYPE (DArea, da, GTK_TYPE_WIDGET)
+
+static void
+da_class_init (DAreaClass *class)
+{
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
+
+  widget_class->realize = da_realize;
+  widget_class->size_allocate = da_size_allocate;
+  widget_class->draw = da_draw;
+}
+
+static void
+da_init (DArea *darea)
+{
+  gtk_widget_set_has_window (GTK_WIDGET (darea), TRUE);
+}
+
+GtkWidget*
+da_new (void)
+{
+  return g_object_new (da_get_type (), NULL);
+}
+
+static void
+da_realize (GtkWidget *widget)
+{
+  GtkAllocation allocation;
+  GdkWindow *window;
+  GdkWindowAttr attributes;
+  gint attributes_mask;
+
+  gtk_widget_set_realized (widget, TRUE);
+
+  gtk_widget_get_allocation (widget, &allocation);
+
+  attributes.window_type = GDK_WINDOW_SUBSURFACE;
+  attributes.x = allocation.x;
+  attributes.y = allocation.y;
+  attributes.width = allocation.width;
+  attributes.height = allocation.height;
+  attributes.wclass = GDK_INPUT_OUTPUT;
+  attributes.visual = gtk_widget_get_visual (widget);
+  attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK;
+
+  attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL;
+
+  window = gdk_window_new (gtk_widget_get_parent_window (widget),
+                           &attributes, attributes_mask);
+  gtk_widget_register_window (widget, window);
+  gtk_widget_set_window (widget, window);
+}
+
+static void
+da_size_allocate (GtkWidget     *widget,
+                  GtkAllocation *allocation)
+{
+  gtk_widget_set_allocation (widget, allocation);
+
+  if (gtk_widget_get_realized (widget))
+    gdk_window_move_resize (gtk_widget_get_window (widget),
+                            allocation->x, allocation->y,
+                            allocation->width, allocation->height);
+}
+
+static gboolean
+da_draw (GtkWidget *widget,
+         cairo_t   *cr)
+{
+  cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); 
+  cairo_paint (cr);
+
+  return TRUE;
+}
+
+int
+main (int argc, char *argv[])
+{
+  GtkWidget *window, *label, *box, *widget;
+
+  gtk_init (NULL, NULL);
+
+  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
+  box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+
+  gtk_container_add (GTK_CONTAINER (window), box);
+  label = gtk_label_new ("Test test");
+  gtk_container_add (GTK_CONTAINER (box), label);
+  widget = da_new ();
+  gtk_widget_set_size_request (widget, 100, 100);
+  gtk_container_add (GTK_CONTAINER (box), widget);
+  gtk_widget_show_all (window);
+
+  gtk_main ();
+
+  return 0;
+}